﻿<!doctype html public '-//W3C//DTD HTML 4.0 Transitional //EN'>
<html>
<head>
<title>AspBox帮助文档</title>
<meta charset='UTF-8' />
<meta name='generator' content='EverEdit' />
<link href='statics/default.css' rel='stylesheet'></link>
<link href='statics/prettify.css' rel='stylesheet'></link>
<script type='text/javascript' src='statics/prettify.js'></script>
<script type='text/javascript' src='statics/jquery-1.10.2.min.js'></script>
<script type='text/javascript' src='statics/code.js'></script>
</head>
<body>
<h1>Active Record 数据查询</h1>

<p><em>引言：</em></p>

<blockquote>
  <p>很多PHP框都自带 Active Record 用于方便查询和更新数据，
      省去了写过多繁琐的原生态SQL查询语句，项目维护更加方便。
      现在我们也模拟应用到AppCore上，使用Active Record可以大大降低项目开发难度。</p>
</blockquote>

<hr />

<h2>获取查询数据</h2>

<p><a name="getsql"></a></p>

<ul>
<li><strong>App.Dao.getSQL() 方法：</strong></li>
</ul>

<p><em>语法</em></p>

<blockquote>
  <p>sql = App.Dao.getSQL()</p>
</blockquote>

<p><em>别名：</em></p>

<blockquote>
  <p>sql = App.Dao.lastSQL()</p>
</blockquote>

<p><em>说明：</em></p>

<blockquote>
  <p>查看输出SQL语句</p>
</blockquote>

<p><em>返回值</em></p>

<blockquote>
  <p>[String (字符串)]</p>
</blockquote>

<p><em>例 ：</em></p>

<blockquote>
  <p>Response.Write M(&#8221;user&#8221;)().Top(10).getSQL</p>
</blockquote>

<hr />

<p><a name="query"></a></p>

<ul>
<li><strong>App.Dao.Query() 方法：</strong></li>
</ul>

<p><em>语法</em></p>

<blockquote>
  <p>Set rs = App.Dao.Query(sql)</p>
</blockquote>

<p><em>参数</em></p>

<blockquote>
  <p>String sql            SQL查询语句</p>
</blockquote>

<p><em>说明：</em></p>

<blockquote>
  <p>获取SQL语句的查询数据</p>
</blockquote>

<p><em>返回值</em></p>

<blockquote>
  <p>[Object (Rs记录集)]</p>
</blockquote>

<p><em>例 ：</em></p>

<blockquote>
  <p>dim rs
      Set rs = App.Dao.Query("select top 10 id,username from #@user")
      '等同于： Set rs = App.Dao.Query("select top 10 id,username from "&amp; App.Dao.tbPrefix &amp;"media")</p>
</blockquote>

<hr />

<p><a name="list"></a></p>

<ul>
<li><strong>App.Dao.List() 方法：</strong></li>
</ul>

<p><em>语法</em></p>

<blockquote>
  <p>arr = App.Dao.List()</p>
</blockquote>

<p><em>说明：</em></p>

<blockquote>
  <p>获取查询数据二维数组(Array)列表</p>
</blockquote>

<p><em>返回值</em></p>

<blockquote>
  <p>[Array (二维数组)]</p>
</blockquote>

<p><em>例 ：</em></p>

<blockquote>
  <p>dim list
      list = M("user")().select("id, username").top(10).List()
      ab.trace list '返回一个二维数组
      dim i, id, username
      For i = 0 To Ubound(list,2)
          id = list(0, i)
          username = list(1, i)
          Response.Write id &amp; " : " &amp; username &amp; "<br>"
      Next</p>
</blockquote>

<hr />

<p><a name="result"></a></p>

<ul>
<li><strong>App.Dao.Result() 方法：</strong></li>
</ul>

<p><em>语法</em></p>

<blockquote>
  <p>Set rs = App.Dao.Result()</p>
</blockquote>

<p><em>别名：</em></p>

<blockquote>
  <p>Set rs = App.Dao.GetRs() 或 Set rs = App.Dao.Fetch()</p>
</blockquote>

<p><em>说明：</em></p>

<blockquote>
  <p>获取查询记录集</p>
</blockquote>

<p><em>返回值</em></p>

<blockquote>
  <p>[Object (Rs记录集)]</p>
</blockquote>

<p><em>例 ：</em></p>

<blockquote>
  <p>dim Rs
      Set Rs = M("user")().select("id, username").top(10).Result()
      ab.trace Rs
      Do While not Rs.eof
          Response.Write Rs("id") &amp; " : " &amp; Rs("username") &amp; "<br>"
          Rs.MoveNext
      Loop</p>
</blockquote>

<hr />

<p><a name="row"></a></p>

<ul>
<li><strong>App.Dao.Row() 方法：</strong></li>
</ul>

<p><em>语法</em></p>

<blockquote>
  <p>Set rs = App.Dao.Row(n)</p>
</blockquote>

<p><em>说明：</em></p>

<blockquote>
  <p>取得第n+1行数据, n=0 表示取第一行数据</p>
</blockquote>

<p><em>参数</em></p>

<blockquote>
  <p>Integer n          参数n表示位置偏移量offset</p>
</blockquote>

<p><em>返回值</em></p>

<blockquote>
  <p>[Object (Rs记录集)]</p>
</blockquote>

<p><em>例 ：</em></p>

<blockquote>
  <p>dim Rs
      Set Rs = App.Dao.Sql("select top 10 id,username from #@user").Row(0) '获取第1行数据
      Set Rs = App.Dao.Sql("select top 10 id,username from #@user").Row(4) '获取第5行数据
      If Not Rs.Eof Then
          Response.Write Rs("id") &amp; " : " &amp; Rs("username")
      End If</p>
</blockquote>

<hr />

<p><a name="getfield"></a></p>

<ul>
<li><strong>App.Dao.getField() 方法：</strong></li>
</ul>

<p><em>语法</em></p>

<blockquote>
  <p>val = App.Dao.getField(field)</p>
</blockquote>

<p><em>说明：</em></p>

<blockquote>
  <p>取得某字段值</p>
</blockquote>

<p><em>参数</em></p>

<blockquote>
  <p>String field          字段名</p>
</blockquote>

<p><em>返回值</em></p>

<blockquote>
  <p>[Integer|String|Boolean (字段值)]</p>
</blockquote>

<p><em>例 ：</em></p>

<blockquote>
  <p>dim username
      'username = M("user")().Where("id=5").getField("username")
      username = M("user")().Find(5).getField("username")</p>
</blockquote>

<hr />

<p><a name="query_condition"></a></p>

<h2>查询条件</h2>

<p>AppCore内置了非常灵活的查询方法，可以快速的进行数据查询操作，查询条件可以用于CURD等任何操作，作为where方法的参数传入即可，下面来一一讲解查询语言的内涵。</p>

<h3>查询方式</h3>

<p>AppCore可以支持直接使用字符串作为查询条件，但是大多数情况推荐使用数组或者字典来作为查询条件，代码逻辑会更清晰简洁。</p>

<p><strong>一、使用字符串作为查询条件</strong></p>

<p>这是最传统的方式，例如：</p>

<pre><code>Set Model = M("User") '实例化Model
Set Rs = Model().Where("type=1 AND status=1").GetRs() 
'最后生成的SQL语句是
SELECT * FROM lx_user WHERE type=1 AND status=1
</code></pre>

<p><strong>二、使用数组作为查询条件</strong></p>

<p>使用数组方式，可以进行条件控制，书写代码逻辑更加清晰，例如：</p>

<p><em>例 1：</em></p>

<pre><code>Set Model = M("User") '实例化Model
dim a_where(2)
a_where(0) = "id&gt;5"
a_where(1) = "reg_time&gt;#2014#"
a_where(2) = "or score&gt;10"
'把查询条件传入查询方法
Set Rs = Model().Where(a_where).Fetch()
'最后生成的SQL语句是
SELECT * FROM lx_user WHERE id&gt;5 AND time&gt;#2014# OR score&gt;10
</code></pre>

<p><em>例 2：</em></p>

<pre><code>Set Model = M("User") '实例化Model
dim a_where : a_where = Array()
a_where = ab.a.push(a_where, "id&gt;5")
a_where = ab.a.push(a_where, "reg_time&gt;#2014#")
a_where = ab.a.push(a_where, "or score&gt;10")
'把查询条件传入查询方法
Set Rs = Model().Where(a_where).Fetch()
'最后生成的SQL语句是
SELECT * FROM lx_user WHERE id&gt;5 AND time&gt;#2014# OR score&gt;10
</code></pre>

<p><em>例 3：</em></p>

<pre><code>a_where = Array("id&gt;5", "email:lajox@19www.com", "reg_time&gt;#2014#")
Set Rs = M("User")().Where(a_where).Fetch()
'最后生成的SQL语句是
SELECT * FROM lx_user WHERE id&gt;5 AND email='lajox@19www.com' AND reg_time&gt;#2014#
</code></pre>

<table border="0" cellspacing="1" cellpadding="0">
    <tbody>
    <tr>
        <th>表达式</th>
        <th>含义</th>
    </tr>
    <tr>
        <td> : 或 = </td>
        <td>等于（=）</td>
    </tr>
    <tr>
        <td> <= </td>
        <td>小于等于（<=）</td>
    </tr>
    <tr>
        <td> >= </td>
        <td>大于等于（>=）</td>
    </tr>
    <tr>
        <td> <> 或 != </td>
        <td>不等于（<>）</td>
    </tr>
    <tr>
        <td> > </td>
        <td>大于（>）</td>
    </tr>
    <tr>
        <td> < </td>
        <td>小于（<）</td>
    </tr>
    </tbody>
</table>

<p><strong>三、使用字典对象来查询</strong></p>

<p>使用字典方式，可以进行条件控制，书写代码逻辑更加清晰，例如：</p>

<pre><code>Set Model = M("User") '实例化Model
Set d_where = AB.C.Dict() '创建字典对象
d_where("reg_time&lt;=") = "#"&amp; CDate(Now()) &amp; "#"
d_where("status") = 1
d_where("username[%]") = "%你%"
'把查询条件传入查询方法
Set Rs = Model().Where(d_where).Fetch()
'最后生成的SQL语句是
SELECT * FROM lx_user WHERE reg_time&lt;=#2014/11/14# AND status=1 AND username LIKE '%你%'
</code></pre>

<table border="0" cellspacing="1" cellpadding="0">
    <tbody>
    <tr>
        <th>表达式</th>
        <th>含义</th>
    </tr>
    <tr>
        <td>[:] 或 [=] 或 都不带</td>
        <td>等于（=）</td>
    </tr>
    <tr>
        <td>[<=]</td>
        <td>小于等于（<=）</td>
    </tr>
    <tr>
        <td>[>=]</td>
        <td>大于等于（>=）</td>
    </tr>
    <tr>
        <td>[<>] 或 [!=]</td>
        <td>不等于（<>）</td>
    </tr>
    <tr>
        <td>[>]</td>
        <td>大于（>）</td>
    </tr>
    <tr>
        <td>[<]</td>
        <td>小于（<）</td>
    </tr>
    <tr>
        <td>[like] 或 [%] 或 [*]</td>
        <td>LIKE模糊查询</td>
    </tr>
    <tr>
        <td>[in] 或 []</td>
        <td>区间查询</td>
    </tr>
    <tr>
        <td>+n （n为任一数字）</td>
        <td>表达式查询，支持SQL语法</td>
    </tr>
    </tbody>
</table>

<hr />

<p><a name="field"></a></p>

<h3>函数方法</h3>

<ul>
<li><strong>App.Dao.Field() 方法：</strong></li>
</ul>

<p><em>语法</em></p>

<blockquote>
  <p>Set dao = App.Dao.Field(field)</p>
</blockquote>

<p><em>别名</em></p>

<blockquote>
  <p>Set dao = App.Dao.Select(field)</p>
</blockquote>

<p><em>说明：</em></p>

<blockquote>
  <p>构建Select查询条件</p>
</blockquote>

<p><em>参数</em></p>

<blockquote>
  <p>String field          字段名（多个字段名用 , 隔开； * 号为取出表的全部字段）</p>
</blockquote>

<p><em>返回值</em></p>

<blockquote>
  <p>[Object (模型对象)]</p>
</blockquote>

<p><em>例 ：</em></p>

<blockquote>
  <p>Set Rs = M("user")().Field("*").Fetch()
      Set Rs = M("user")().Field("id, username").Fetch()
      Set Rs = App.Dao.T("user").Field("id, username").Fetch()
      '最后生成的SQL语句是
      SELECT id, username FROM lx_user</p>
</blockquote>

<p><a name="from"></a></p>

<ul>
<li><strong>App.Dao.From() 方法：</strong></li>
</ul>

<p><em>语法</em></p>

<blockquote>
  <p>Set dao = App.Dao.From(table)</p>
</blockquote>

<p><em>别名</em></p>

<blockquote>
  <p>Set dao = App.Dao.T(table)</p>
</blockquote>

<p><em>说明：</em></p>

<blockquote>
  <p>构建FROM查询条件</p>
</blockquote>

<p><em>参数</em></p>

<blockquote>
  <p>String table          表名</p>
</blockquote>

<p><em>返回值</em></p>

<blockquote>
  <p>[Object (模型对象)]</p>
</blockquote>

<p><em>例 ：</em></p>

<blockquote>
  <p>dim dao
      'Set rs = M("")().Query("select * from #@user")
      Set rs = App.Dao.T("User").Fetch()
      '最后生成的SQL语句是
      SELECT * FROM lx_user</p>
</blockquote>

<p><a name="alias"></a></p>

<ul>
<li><strong>App.Dao.Alias() 方法：</strong></li>
</ul>

<p><em>语法</em></p>

<blockquote>
  <p>Set dao = App.Dao.Alias(alias)</p>
</blockquote>

<p><em>别名</em></p>

<blockquote>
  <p>Set dao = App.Dao.A(alias)</p>
</blockquote>

<p><em>说明：</em></p>

<blockquote>
  <p>用于设置表的别名</p>
</blockquote>

<p><em>参数</em></p>

<blockquote>
  <p>String alias          表的别名</p>
</blockquote>

<p><em>返回值</em></p>

<blockquote>
  <p>[Object (模型对象)]</p>
</blockquote>

<p><em>例 ：</em></p>

<blockquote>
  <p>Set rs = M("User")().A("u").Field("u.*").Where("u.id&lt;10").Fetch()
      '最后生成的SQL语句是
      SELECT u.* FROM lx_user u WHERE u.id&lt;10</p>
</blockquote>
<script type='text/javascript'>
$(document).ready(function(){
  if($('code').length>0){
    $('code').parent().addClass('prettyprint');
    prettyPrint();
};
});
</script>
</body>
</html>